package org.jsola.hr.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.admin.vo.HeaderFieldsListVO;
import org.jsola.core.Page;
import org.jsola.core.Result;
import org.jsola.hr.dto.CompanyNecessaryFieldAddDTO;
import org.jsola.hr.dto.CompanyNecessaryFieldBatchDTO;
import org.jsola.hr.dto.CompanyNecessaryFieldUpdateDTO;
import org.jsola.hr.dto.UpdateEmpFieldDTO;
import org.jsola.hr.query.CompanyNecessaryFieldQuery;
import org.jsola.hr.query.ModuleFieldQuery;
import org.jsola.hr.vo.*;

import java.util.List;
import java.util.Map;

/**
 * 公司员工必填字段信息
 *
 * @author zhr
 */
@Api(tags = "hr-公司员工必填字段信息")
public interface ICompanyNecessaryFieldControllerAPI {

    /**
     * 获取未选择的自定义字段（花名册自定义表头）
     *
     * @param companyId 用工单位id
     * @return 字段list
     */
    @ApiOperation(value = "获取未选择的自定义字段（花名册自定义表头）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "用工单位id", paramType = "path")
    })
    Result<List<HeaderFieldsListVO>> getCustomField(String companyId);

    /**
     * 为所有公司添加字段
     *
     * @param companyNecessaryFieldAddDTO 新增对象
     * @return 初始化成功公司数量
     */
    @ApiOperation(value = "为所有公司添加字段")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldAddDTO", dataType = "CompanyNecessaryFieldAddDTO", value = "员工保存动态表单字段的值参数", paramType = "body"),
    })
    Result<Integer> addFiledForAllCompany(CompanyNecessaryFieldAddDTO companyNecessaryFieldAddDTO);

    /**
     * 新增公司员工必填字段信息
     *
     * @param companyNecessaryFieldAddDTO 公司员工必填字段信息新增实体
     * @return 公司员工必填字段信息展示对象
     */
    @ApiOperation(value = "新增公司员工必填字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldAddDTO", dataType = "CompanyNecessaryFieldAddDTO", value = "新增公司员工必填字段信息", paramType = "body")
    })
    Result<CompanyNecessaryFieldVO> save(CompanyNecessaryFieldAddDTO companyNecessaryFieldAddDTO);


    /**
     * 修改公司员工必填字段信息
     *
     * @param companyNecessaryFieldUpdateDTO 公司员工必填字段信息
     * @return 更新数量
     */
    @ApiOperation(value = "修改公司员工必填字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldUpdateDTO", dataType = "CompanyNecessaryFieldUpdateDTO", value = "修改公司员工必填字段信息", paramType = "body")
    })
    Result<Integer> update(CompanyNecessaryFieldUpdateDTO companyNecessaryFieldUpdateDTO);

    /**
     * 批量编辑、新增、删除公司员工必填字段信息
     * @param companyNecessaryFieldBatchDTO 要操作的公司员工必填字段信息
     * @return 操作之后的全部公司员工必填字段信息
     */
    @ApiOperation(value = "批量编辑、新增、删除公司员工必填字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldBatchDTO", dataType = "CompanyNecessaryFieldBatchDTO", value = "要操作的字段数据", paramType = "body")
    })
    Result batch(CompanyNecessaryFieldBatchDTO companyNecessaryFieldBatchDTO);

   	/**
     * 小程序端修改公司员工信息
     *
     * @param companyFieldAndValueListVO 公司员工必填字段信息
     * @return 更新数量
     */
    @ApiOperation(value = "小程序端修改公司员工信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyFieldAndValueListVO", dataType = "CompanyFieldAndValueListVO", value = "修改公司员工必填字段信息", paramType = "body")
    })
    Result<Integer> updateForApp(CompanyFieldAndValueListVO companyFieldAndValueListVO);

    /**
     * 小程序端修改公司员工某个模块的信息
     *
     * @param companyFieldAndValueUpdateVO 公司员工必填字段信息
     * @return 更新数量
     */
    @ApiOperation(value = "小程序端修改公司员工某个模块的信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyFieldAndValueUpdateVO", dataType = "CompanyFieldAndValueUpdateVO", value = "修改公司员工必填字段信息", paramType = "body")
    })
    Result<Integer> updateAppForModule(CompanyFieldAndValueUpdateVO companyFieldAndValueUpdateVO);


    /**
     * 删除单个公司员工必填字段信息，彻底删除
     *
     * @param companyNecessaryFieldId 公司员工必填字段信息id
     * @return 删除数量
     */
    @ApiOperation(value = "删除单个公司员工必填字段信息，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldId", dataType = "String", value = "公司员工必填字段信息id", paramType = "path")
    })
    Result<Integer> delete(String companyNecessaryFieldId);


    /**
     * 批量删除公司员工必填字段信息，彻底删除
     *
     * @param companyNecessaryFieldIds 公司员工必填字段信息id集合
     * @return 删除数量
     */
    @ApiOperation(value = "批量删除公司员工必填字段信息，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldIds", dataType = "String[]", value = "公司员工必填字段信息id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> deleteBatch(String[] companyNecessaryFieldIds);


    /**
     * 根据公司员工必填字段信息id查询公司员工必填字段信息详情
     *
     * @param companyNecessaryFieldId 公司员工必填字段信息id
     * @return 公司员工必填字段信息详情
     */
    @ApiOperation(value = "根据公司员工必填字段信息id查询公司员工必填字段信息详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldId", dataType = "String", value = "公司员工必填字段信息id", paramType = "path")
    })
    Result<CompanyNecessaryFieldVO> findById(String companyNecessaryFieldId);


    /**
     * 查询公司员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "查询公司员工必填字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery", dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<List<CompanyNecessaryFieldListVO>> listAll(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);


    /**
     * pc端查询公司员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "pc端查询公司员工必填字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery", dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<CompanyFieldForPcListVO> listAllForPc(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);

    /**
     * pc端查询公司员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "pc端查询公司员工必填字段信息v2")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery"
                    , dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<List<CompanyFieldInfoVO>> listForPc(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);

    /**
     * pc端查询公司员工必填字段信息 租户级自定义字段查询全部用工单位自定义字段 租户级companyId为0
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "pc端查询公司员工必填字段信息v2")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery"
                    , dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<List<CompanyFieldInfoVO>> listForPc2(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);

    /**
     * 查询公司动态表单模块
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "查询公司动态表单模块")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery", dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<List<CompanyNecessaryModuleCodeVO>> listCompanyModuleCodes(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);

    /**
     * 职薪人小程序-员工信息查询
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "职薪人小程序-员工信息查询")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery", dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<List<CompanyNecessaryModuleCodeVO>> listCompanyModuleCodesForEmployee(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);

    /**
     * 查询公司动态表单员工填写
     *
     * @param moduleFieldQuery 查询参数
     * @return page
     */
    @ApiOperation(value = "查询公司动态表单员工填写")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "moduleFieldQuery", dataType = "ModuleFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<EmpFieldValueVO> getEmpFieldValue(ModuleFieldQuery moduleFieldQuery);

    Result<Map<String,EmpFieldValueVO>> getAllEmpFieldValue(ModuleFieldQuery moduleFieldQuery);

    /**
     * 员工保存动态表单字段的值
     *
     * @param updateEmpFieldDTO 修改对象
     * @param isVerify          是否校验
     * @return str
     */
    @ApiOperation(value = "员工保存动态表单字段的值")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "updateEmpFieldDTO", dataType = "UpdateEmpFieldDTO", value = "员工保存动态表单字段的值参数", paramType = "body"),
            @ApiImplicitParam(name = "isVerify", dataType = "Boolean", value = "是否校验", paramType = "query")
    })
    Result<String> saveEmpFieldValue(UpdateEmpFieldDTO updateEmpFieldDTO, Boolean isVerify);

    /**
     * 员工保存动态表单字段的值
     *
     * @param updateEmpFieldDTO 修改对象
     * @return str
     */
    @ApiOperation(value = "员工修改动态表单字段的值")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "updateEmpFieldDTO", dataType = "UpdateEmpFieldDTO", value = "员工保存动态表单字段的值参数", paramType = "body")
    })
    Result<String> updateEmpFieldValue(UpdateEmpFieldDTO updateEmpFieldDTO);

    /**
     * 员工保存动态表单字段的值
     *
     * @param updateEmpFieldDTO 修改对象
     * @return str
     */
    @ApiOperation(value = "员工删除动态表单字段的值")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "updateEmpFieldDTO", dataType = "UpdateEmpFieldDTO", value = "员工保存动态表单字段的值参数", paramType = "body")
    })
    Result<String> deleteEmpFieldValue(UpdateEmpFieldDTO updateEmpFieldDTO);

    /**
     * 校验员工删除动态表单字段的值
     *
     * @param empInfoId 员工id
     * @param companyId 公司id
     * @return result
     */
    @ApiOperation(value = "校验员工删除动态表单字段的值")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "empInfoId", dataType = "String", value = "员工id", paramType = "query"),
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "公司id", paramType = "query"),
    })
    Result<String> checkEmpFieldValue(String empInfoId, String companyId);


    /**
     * app端查询当前员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "app端查询当前员工必填字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery", dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<CompanyFieldAndValueListVO> listAllForApp(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);

    /**
     * app端查询当前员工必填模块信息
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "app端查询当前员工必填模块信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery", dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<List<String>> listNecessaryModeForApp(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);


    /**
     * app端查询当前员工某个模块的字段信息
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "app端查询当前员工某个模块的字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery", dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<List<CompanyNecessaryFieldVO>> listForAppModule(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);


    /**
     * 分页查询公司员工必填字段信息
     *
     * @param companyNecessaryFieldQuery 公司员工必填字段信息查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询公司员工必填字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldQuery", dataType = "CompanyNecessaryFieldQuery", value = "公司员工必填字段信息查询参数", paramType = "query")
    })
    Result<Page<CompanyNecessaryFieldListVO>> page(CompanyNecessaryFieldQuery companyNecessaryFieldQuery);


    /**
     * 批量修改公司员工必填字段信息
     *
     * @param companyNecessaryFieldBatchDTO 公司员工必填字段信息
     * @return 更新数量
     */
    @ApiOperation(value = "批量修改公司员工必填字段信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyNecessaryFieldBatchDTO", dataType = "CompanyNecessaryFieldBatchDTO", value = "修改公司员工必填字段信息", paramType = "body")
    })
    Result<Integer> updateNecessaryBatch(CompanyNecessaryFieldBatchDTO companyNecessaryFieldBatchDTO);
}

